/////////////////////////////////////////////
//主控键盘的通信模块头文件,kb_net.h
//
////////////////////////////////////////////

#ifndef __KB_NET_H__
#define __KB_NET_H__

#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <fcntl.h>
#include <pthread.h>
#include <netdb.h>
#include <sys/socket.h>
#include <sys/ioctl.h>
#include <signal.h>
#include <arpa/inet.h>

#include "win_types.h"
#include "kb_def.h"

#define RECV_BUF_SIZE       (16 * 1024)
#define KEY_DATA_SIZE       (1 * 1024)   //一个键盘数据的最大长度
#define SEND_BUF_SIZE       (320 * 1024 * MAX_CHAN)
#define TCP_PACK_SIZE       1024   //1个TCP包的大小

static BOOL IsListening = FALSE ;

typedef struct ip_hdr    //定义IP首部 
{ 
	UCHAR h_verlen;            //4位首部长度,4位IP版本号 
	UCHAR tos;                //8位服务类型TOS 
	USHORT total_len;        //16位总长度（字节） 
	USHORT ident;            //16位标识 
	USHORT frag_and_flags;    //3位标志位 
	UCHAR ttl;                //8位生存时间 TTL 
	UCHAR proto;            //8位协议 (TCP, UDP 或其他) 
	USHORT checksum;        //16位IP首部校验和 
	UINT sourceIP;            //32位源IP地址 
	UINT destIP;            //32位目的IP地址 
}IP_HEADER; 

typedef struct tcp_hdr //定义TCP首部 
{ 
	USHORT th_sport;            //16位源端口 
	USHORT th_dport;            //16位目的端口 
	UINT th_seq;                //32位序列号 
	UINT th_ack;                //32位确认号 
	UCHAR th_lenres;            //4位首部长度/6位保留字 
	UCHAR th_flag;                //6位标志位 
	USHORT th_win;                //16位窗口大小 
	USHORT th_sum;                //16位校验和 
	USHORT th_urp;                //16位紧急数据偏移量 
}TCP_HEADER; 


//RAW_SOCKET线程
static void* Raw_Socket(void* pParam) ;

//初始化
int net_enc_init(void);

//通信模块退出
int net_dec_exit(void);


// 接收数据的线程(1个编码器连接有1个数据接收线程)
static void *RecvData_Thread(void * pParam);


//发送数据包
static int Send_NetPacket(const char * DvsIP,WORD DvsPort,TCmdHead * pPacket) ;


/*
功能：云台控制
输入：DvsIP-编码器IP，
	  DvsPort-编码器端口
	  ChanNum-编码器通道号
	  ePtzAct-控制类型
	  ActParam-控制参数
返回：0-错误，正数-成功
*/

int PtzControl(const char * DvsIP,WORD DvsPort,BYTE ChanNum,enPtzAction ePtzAct,TPtzActParam ActParam);

/*
功能：切换摄像机
  pDecoder：解码器参数
  pEncoder：编码器参数
*/
int SwitchCamera(TDeviceInfo * pDecoder,TDeviceInfo * pEncoder);

#endif

